#ifndef SINGLETON_H
#define SINGLETON_H

#include <global.h>

template<typename T>
class Singleton{

protected:
    Singleton() = default;
    //不允许拷贝
    Singleton(const Singleton<T>&) = delete;
    //不允许赋值
    Singleton& operator=(const Singleton<T>& st) = delete;
    //始终只有一个实例（智能指针）当计数为0将会被回收
    // 由于这里只是申明，所以我们要在外部初始化
    // 由于他是在模版类中，所以我们需要放在模版类中初始化
    static std::shared_ptr<T> _instance;
public:
    static std::shared_ptr<T> GetInstance(){
        //一个更安全的初始化方式
        // s_flag因为是静态的，所以他只会初始化一次
        /*
            std::once_flag 是 C++11 标准库中的一个类，
它用于确保某个函数或代码块只执行一次。它经常与线程回调 std::call_once 配合使用，
以实现线程安全的一次性初始化
        */
        static std::once_flag s_flag;
        //以下方法也只是会调用一次
        std::call_once(s_flag,[&](){
            _instance = std::shared_ptr<T>(new T);
        });
        return _instance;
    }

    void PrintAddress(){
        // 打印出智能指针的原始指针
        std::cout << _instance.get() << std::endl;
    }


    ~Singleton(){
        std::cout << "this is singleton destroy";
    }

};

//初始化下
template<typename T>
std::shared_ptr<T> Singleton<T>::_instance = nullptr;

#endif // SINGLETON_H
